package beans.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import util.HibernateFactory;
import beans.AtuacaoProfissional;
import beans.Endereco;
import beans.FormacaoAcademica;
import beans.FormacaoComplementar;
import beans.Informacoes;
import beans.ProducaoBibliografica;
import beans.Usuario;

public class UsuarioDAO {

	private SessionFactory factory;
	private Session session;
	
	public static void main(String args[]) {
		UsuarioDAO  DAO = new UsuarioDAO();
		DAO.beginTransaction();
		Usuario user = DAO.retrieve("gabriel.gravena@gmail.com");
		Informacoes info = user.getInformacoes();
		
		System.out.println(info.getNome());
		DAO.commit();
	}

	public void beginTransaction() {
		System.out.println("Factory: " + factory);
		this.session = factory.openSession();
		this.session.beginTransaction();
	}
	
	public List<Usuario> getUsuarios() {
		return (List<Usuario>)this.session.createQuery("from Usuario").list();
	}

	public void commit() {
		this.session.getTransaction().commit();
		this.session.close();
	}

	public UsuarioDAO() {
		try {
			factory = HibernateFactory.getSessionFactory();
			System.out.println("AQUI");
		} catch (Exception e) {
			System.out.println("ERRO");
			e.printStackTrace();
		}

	}

	public void insert(Usuario usuario) {
		session.save(usuario);
	}

	public void saveAndUpdate(Usuario usuario) {
		session.saveOrUpdate(usuario);
	}

	public Usuario retrieve(String pk) {
		Usuario usuario;
		usuario = (Usuario) session.get(Usuario.class, pk);

		return usuario;
	}
	
	public Informacoes retrieveInfo(Integer pk){
		Informacoes informacoes;
		informacoes = (Informacoes) session.get(Informacoes.class, pk);
		
		return informacoes;
	}
	
	public Endereco retrieveEnd(Integer pk){
		Endereco endereco;
		endereco = (Endereco) session.get(Endereco.class, pk);
		
		return endereco;
	}
	
	public FormacaoAcademica retrieveFormAcadem(Integer pk){
		FormacaoAcademica formAcad;
		formAcad = (FormacaoAcademica) session.get(FormacaoAcademica.class, pk);
		
		return formAcad;
	}
	
	public FormacaoComplementar retrieveFormComp(Integer pk){
		FormacaoComplementar formComp;
		formComp = (FormacaoComplementar) session.get(FormacaoComplementar.class, pk);
		
		return formComp;
	}

	public AtuacaoProfissional retrieveAtuaProf(Integer pk){
		AtuacaoProfissional atuaProf;
		atuaProf = (AtuacaoProfissional) session.get(AtuacaoProfissional.class, pk);
		
		return atuaProf;
	}
	
	public ProducaoBibliografica retrieveProdBiblio(Integer pk){
		ProducaoBibliografica prodBiblio;
		prodBiblio = (ProducaoBibliografica) session.get(ProducaoBibliografica.class, pk);
	
		return prodBiblio;
	}
	
	public void delete(Usuario usuario) throws Exception {
			session.delete(usuario);
			session.flush();
	}

	public void setInformacoes(String pk, Informacoes info) {
			Usuario user = (Usuario) this.session.load(Usuario.class, pk);
			user.setInformacoes(info);
			this.session.flush();
	}

	public Session getSession() {
		return session;
	}

	public void setSession(Session session) {
		this.session = session;
	}
	
	
}
